<?php

require_once("login/src/Model/Email.php");
require_once("login/src/Model/Password.php");
require_once("login/src/Model/Username.php");
require_once("login/src/Model/UserInfo.php");

class RegisterValidation
{
	/**
	*@var UserInfoDAL
	**/
	private $userinfoDAL;

	/**
	*@return string "session"
	**/
	private static $errorMessage = "RegisterValidation::errorMessage";


	public function __construct()
	{
		$this->userinfoDAL = new UserInfoDAL();
	}

	/**
	*@param string email
	*@param string username
	*@param string password
	*@param string password2
	*@return string bool
	**/
	public function validateRegisterInfo($email, $username, $password, $password2)
	{
		$_SESSION[self::$errorMessage] = "";

		$isValidEmail = $this->ValidateEmail($email);
		$isValidUsername = $this->ValidateUsername($username);
	   	$isValidPassword = $this->ValidatePassword($password, $password2);

		if($isValidEmail && $isValidUsername && $isValidPassword)
		{
			return true;
		}
		return false;
	}

	/**
	*@return string session
	**/
	public function getErrorMessage()
	{
		if(isset($_SESSION[self::$errorMessage]))
		{
			return $_SESSION[self::$errorMessage];
		}
		return "";
	}


	/**
	*@param UserInfo
	*@return bool
	**/
	public function usernameExists(Userinfo $userinfo)
	{
		$allUsers = $this->userinfoDAL->getUserList();
		foreach($allUsers as $u)
		{	
			$isSame = $userinfo->checkForExistingUsername($u);
			if($isSame) 
			{
				$_SESSION[self::$errorMessage] .= " Användarnamnet är upptaget    .";
				return false;
			}
		}
		return false;
	}

	/**
	*@param string
	*@return bool 
	**/
	private function stripTags($toCheck)
	{
		$checkedString = strip_tags($toCheck);
		if($checkedString != $toCheck)
		{
			return true;
		}
		return false;
	}


	/**
	*@param string
	*@return bool 
	**/
	private function ValidateEmail($email)
	{
		$subject = $email;
		$noTags = $this->stripTags($email);
		$pattern = Email::Email_regex;
		preg_match($pattern, $subject, $matches);

		if(strlen($email) <= 0) 
		{
			$_SESSION[self::$errorMessage] .= " Epost måste fyllas i    .";
			return false;
		}

		elseif(empty($matches))
		{
			$_SESSION[self::$errorMessage] .= " Felaktigt format på epost    .";
			return false;
		}

		else if($noTags)
		{
			$_SESSION[self::$errorMessage] .= " Epost innehåller ogiltiga tecken    .";
			return false;
		}
		return true;
	}


	/**
	*@param string
	*@return bool 
	**/
	private function ValidateUsername($username)
	{
		$noTags = $this->stripTags($username);
		if($noTags)
		{
			$_SESSION[self::$errorMessage] .= " Användarnamnet innehåller ogiltiga tecken, tex: <>    .";
		}
		elseif(strlen($username) <  Username::Min_Username_length)
		{
			$_SESSION[self::$errorMessage] .= " Användarnamnet är för kort    .";
			return false;
		}

		elseif(strlen($username) > Username::Max_Username_length)
		{
			$_SESSION[self::$errorMessage] .= " Användarnamnet är för långt    .";
			return false;
		}
		return true;
	}


	/**
	*@param string password
	*@param string password2
	*@return bool 
	**/
	private function ValidatePassword($password, $password2)
	{
		$noTags = $this->stripTags($password);
		if($noTags)
		{
			$_SESSION[self::$errorMessage] .= " Lösenordet innehåller ogiltiga tecken    .";
		}
		elseif($password != $password2)
		{
			$_SESSION[self::$errorMessage] .= " Du har angett olika lösenord    .";
			return false;	
		}

		elseif(strlen($password)  < Password::Min_Password_Length && 
			   strlen($password2) < Password::Min_Password_Length)
		{
			$_SESSION[self::$errorMessage] .= " Lösenordet är för kort    .";
			return false;
		}

		elseif(strlen($password)  > Password::Max_Password_Length && 
			   strlen($password2) > Password::Max_Password_Length)
		{
			$_SESSION[self::$errorMessage] .= " Lösenordet är för långt    .";
			return false;
		}
		return true;
	}

}